/*AC自动机 = Trie图 <-(优化)- Trie字典树 + KMP 
* 1.KMP
    next[]:在p[]中，以p[i]结尾的后缀，能够匹配的从1开始的非平凡前缀的最大长度
    平凡前缀:完全相等
    //求next的过程，s,p的下标均从1开始
    next[0] = next[1] = 0;
    for(i = 2, j = 0; i <= n; i++)
    {
        while(j && s[i] != p[j+1]) j = next[j];
        if(s[i] == p[j+1]) j++;
        next[i] = j;
    }

* 2.AC自动机:对Trie 每个点的next一定比自己层数低,所以可以层序遍历bfs
    //trie树在每个节点上保存字符串的前缀 
    cnt节点出现的次数
    next在trie的每个节点上记录与当前已匹配串后缀匹配长度最大的前缀，即匹配失败的回溯点
    she在h处匹配失效会指向he的h(h已匹配)
    while(hh <= tt)
    {
        t = q[hh++];
        for(i = 0; i < 26; i++)
            c = trie[t, i];
            j = next[t];
            while(j && !trie[j, i]) j = next[j];
            if(trie[j, i]) j = trie[j, i];
            next[c] = j;
    }
j
* 本题:
    把前面每一个节点的权值累加到下一个节点上
*/ 

#define DEBUG
#pragma GCC optimize("O1,O2,O3,Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010, INF = 0x3f3f3f3f;

int n, m;
int trie[N][26], dar[N], nxt[N], idx; 
//dar[]:dar表示每个节点为结尾的结束标识
//nxt[]:失配指针数组,nxt[u]描述在u结点失配时，找到root~u的最长后缀相同的最长前缀root~v
int q[N];
char str[N];
int f[N][N];
// f[i][j]:DNA扫描到第i个字母，且当前走到了trie里面的第j个节点的所有操作方案中，最少的修改数量

int get(char c) //返回下标
{
    switch(c)
    {
        case 'A': return 0;
        case 'T': return 1;
        case 'G': return 2;
        case 'C': return 3;
    }
    return -1;
}

void insert()
{
    int p = 0;
    for(int i = 0; str[i]; i++)
    {
        int t = get(str[i]); //返回str[i]的下标
        if(!trie[p][t]) trie[p][t] = ++idx; //节点不存在就新建
        p = trie[p][t]; //指向下一个字符
    }
    dar[p] = 1; //遍历完毕，结束标记
}

void build()
{
    int hh = 0, tt = -1;
    for(int i = 0; i < 4; i++)
        if(trie[0][i]) 
            q[++tt] = trie[0][i]; //存储所有根节点

    while(hh <= tt)
    {
        int t = q[hh++]; //匹配节点
         for(int i = 0; i < 4; i++)
        {
            /*
            int c = trie[t][i]; //当前字符的每一种情况
            if(!c) continue; //当前情况不存在  
            int j = nxt[t]; //当前已匹配串的最长相同后缀
            while(j && !trie[j][i]) j = nxt[j]; //找到回溯点
            if(trie[j][i]) j = trie[j][i]; //当前节点存在，指向已匹配位置的下一个位置
            nxt[c] = j; //保存回溯点
            q[++tt] = c;
            */

            //线性优化
            int c = trie[t][i]; //当前字符的每一种情况
            if(!c) trie[t][i] = trie[nxt[t]][i]; //如果当前情况不存在，则考虑跳转
            else{
                nxt[c] = trie[nxt[t]][i]; //nextval优化
                q[++tt] = c;
                dar[c] |= dar[nxt[c]]; //1.失配指针是本身 2.失配指针是跳转节点
            }  
            
        } 
    }
    
}

int query()
{
    memset(f, 0x3f, sizeof f);
    f[0][0] = 0;

    for(int i = 0; i < m; i++) //串长度
        for(int j = 0; j <= idx; j++) //遍历所有节点
            for(int k = 0; k < 4; k++) { //枚举当前节点的每个方向的病毒路径
                int t = get(str[i+1]) != k; //当前这个节点是否在病毒序列

                // while(j && !trie[j][t]) j = nxt[j];
                // if(trie[j][t]) j = trie[j][t];
                
                //线性优化
                int p = trie[j][k]; 
                if (!dar[p]) //当前病毒序列未结束
                    f[i + 1][p] = min(f[i + 1][p], f[i][j] + t);
        }
    int res = INF;
    for(int i = 0; i <= idx; i++) res = min(res, f[m][i]);
    return res == INF ? -1 : res;
}

void PrintLine()
{
    for(int i = 0; i < idx; i++)
    for(int j = 0; j < 26; j++){
        if(trie[i][j])
        {
            int nid = trie[i][j]; 
            printf("cur:%d->nid:%d char:%c next:%d cnt:%d\n", i, nid, j+'a', nxt[nid], dar[nid]);
        }
    }
}
int main()
{

    #ifdef DEBUG
    freopen("./in.txt","r",stdin);
    #else
    ios::sync_with_stdio(false);   
	cin.tie(0);
    #endif

    int T = 1;
    while(scanf("%d ", &n), n)
    {
        
        memset(trie, 0, sizeof trie);
        memset(dar, 0, sizeof dar);
        memset(nxt, 0, sizeof nxt);
        idx = 0;

        for(int i = 0; i < n; i++){
            scanf("%s", str); insert();
        }
        
        build(); 
        
        scanf("%s", str+1);
        m = strlen(str+1);
        
        printf("Case %d: %d\n", T++, query());
    }
    return 0;
}

